using System.Runtime.ExceptionServices;
using Microsoft.Maui.Dispatching;

namespace MauiBuilder.Services
{
    /// <summary>
    /// 全局错误处理服务
    /// 用于捕获和处理应用程序中的未处理异常
    /// </summary>
    public static class ErrorHandlingService
    {
        private static bool _initialized = false;

        /// <summary>
        /// 初始化全局错误处理
        /// </summary>
        public static void Initialize()
        {
            if (_initialized) return;
            
            // 订阅未处理的异常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            
            // 订阅未观察到的任务异常
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
            
            _initialized = true;
        }

        /// <summary>
        /// 处理未处理的异常
        /// </summary>
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                var exception = e.ExceptionObject as Exception;
                if (exception != null)
                {
                    LogManager.Instance?.LogError($"未处理的异常: {exception}");
                    
                    // 在调试模式下显示详细错误信息
#if DEBUG
                    System.Diagnostics.Debug.WriteLine($"=== 未处理的异常 ===");
                    System.Diagnostics.Debug.WriteLine($"消息: {exception.Message}");
                    System.Diagnostics.Debug.WriteLine($"堆栈跟踪: {exception.StackTrace}");
                    System.Diagnostics.Debug.WriteLine($"内部异常: {exception.InnerException?.Message}");
#endif
                }
            }
            catch
            {
                // 防止在处理异常时再次抛出异常
            }
        }

        /// <summary>
        /// 处理未观察到的任务异常
        /// </summary>
        private static void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e)
        {
            try
            {
                LogManager.Instance?.LogError($"未观察到的任务异常: {e.Exception}");
                
                // 在调试模式下显示详细错误信息
#if DEBUG
                System.Diagnostics.Debug.WriteLine($"=== 未观察到的任务异常 ===");
                System.Diagnostics.Debug.WriteLine($"消息: {e.Exception?.Message}");
                System.Diagnostics.Debug.WriteLine($"堆栈跟踪: {e.Exception?.StackTrace}");
#endif
                
                // 标记异常已处理，防止应用程序崩溃
                e.SetObserved();
            }
            catch
            {
                // 防止在处理异常时再次抛出异常
            }
        }

        /// <summary>
        /// 安全执行操作，捕获并记录任何异常
        /// </summary>
        /// <param name="action">要执行的操作</param>
        /// <param name="operationName">操作名称，用于日志记录</param>
        public static async Task SafeExecuteAsync(Func<Task> action, string operationName)
        {
            try
            {
                await action();
            }
            catch (Exception ex)
            {
                LogManager.Instance?.LogError($"操作 '{operationName}' 执行失败: {ex}");
                
                // 在调试模式下显示详细错误信息
#if DEBUG
                System.Diagnostics.Debug.WriteLine($"=== 操作执行失败 ===");
                System.Diagnostics.Debug.WriteLine($"操作: {operationName}");
                System.Diagnostics.Debug.WriteLine($"消息: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"堆栈跟踪: {ex.StackTrace}");
#endif
            }
        }

        /// <summary>
        /// 安全执行操作，捕获并记录任何异常
        /// </summary>
        /// <param name="action">要执行的操作</param>
        /// <param name="operationName">操作名称，用于日志记录</param>
        public static void SafeExecute(Action action, string operationName)
        {
            try
            {
                action();
            }
            catch (Exception ex)
            {
                LogManager.Instance?.LogError($"操作 '{operationName}' 执行失败: {ex}");
                
                // 在调试模式下显示详细错误信息
#if DEBUG
                System.Diagnostics.Debug.WriteLine($"=== 操作执行失败 ===");
                System.Diagnostics.Debug.WriteLine($"操作: {operationName}");
                System.Diagnostics.Debug.WriteLine($"消息: {ex.Message}");
                System.Diagnostics.Debug.WriteLine($"堆栈跟踪: {ex.StackTrace}");
#endif
            }
        }
    }
}